package cn.itcast.web.controller.cargo;


import cn.itcast.common.utils.BeanMapUtils;
import cn.itcast.domain.cargo.ContractExample;
import cn.itcast.domain.cargo.Export;
import cn.itcast.domain.cargo.ExportProduct;
import cn.itcast.domain.cargo.ExportProductExample;
import cn.itcast.domain.system.User;
import cn.itcast.service.cargo.ExportProductService;
import cn.itcast.service.cargo.ExportService;
import cn.itcast.vo.UserCount;
import cn.itcast.web.controller.BaseController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.github.pagehelper.PageInfo;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("/cargo/export")
public class PdfController extends BaseController {

	@Reference
	private ExportService exportService; //报运单service

	@Reference
	private ExportProductService exportProductService; //商品service

	/**
	 * 报运单PDF预览
	 *  参数：报运单ID
	 */
	@RequestMapping("/exportPdf")
	public void exportPdf(String id) throws  Exception {
		//- 根据勾选的报运单id，查询报运单对象Export
		Export export = exportService.findById(id);
		//- 根据勾选的报运单id，查询报运单下的所有商品List  (exportId)
		ExportProductExample example = new ExportProductExample();
		ExportProductExample.Criteria criteria = example.createCriteria();
		criteria.andExportIdEqualTo(id);
		List<ExportProduct> list = exportProductService.findAll(example);
		//- 将Export对象转化为Map集合
//		Map map = new HashMap();
//		map.put("id",export.getId());
//		map.put("marks",export.getMarks());
		Map<String, Object> map = BeanMapUtils.beanToMap(export);
		//- 将list集合转化为JRBeanCollectionDataSource对象
		JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(list);
		//- 通过JasperReport完成PDF文件操作
		//1.获取路径
		String path = session.getServletContext().getRealPath("/")+"/jasper/export.jasper";
		//2.数据填充
		JasperPrint jasperPrint = JasperFillManager.fillReport(path, map, dataSource);//路径，map集合数据，jrdatasource;
		//3.流的形式输出文件
		JasperExportManager.exportReportToPdfStream(jasperPrint,response.getOutputStream());
	}

	/**
	 * chart图形模板（了解）
	 *      在pdf文件中，已图形的实行展示统计数据（饼状图）
	 *      数据：通过list进行数据填充
	 */
	@RequestMapping("/exportPdf06")
	public void exportPdf06() throws  Exception {
		//1.获取模板路径
		String path = session.getServletContext().getRealPath("/")+"/jasper/test06.jasper";
		//2.数据填充，创建JasperPrint对象
		//查询数据库，获取用户列表
		List<UserCount> list = new ArrayList<>();
		for (int i = 0; i <5 ; i++) {
			UserCount uc = new UserCount();
			uc.setCompany("企业"+i);
			uc.setCount( i * 100l);
			list.add(uc);
		}

		JRDataSource datasource = new JRBeanCollectionDataSource(list);

		JasperPrint jasperPrint = JasperFillManager.fillReport(path, new HashMap<>(), datasource);//路径，map集合数据，jrdatasource;
		//3.已数据流预览下载pdf文件
		JasperExportManager.exportReportToPdfStream(jasperPrint,response.getOutputStream());
	}

	/**
	 * 分组报表（了解）
	 *  在list类型数据填充的基础上，使用某一个字段完成数据分组显示
	 */
	@RequestMapping("/exportPdf05")
	public void exportPdf05() throws  Exception {
		//1.获取模板路径
		String path = session.getServletContext().getRealPath("/")+"/jasper/test05.jasper";
		//2.数据填充，创建JasperPrint对象
		//查询数据库，获取用户列表
		List<User> list = new ArrayList<>();
		for (int i = 0; i <5 ; i++) {
			User user = new User();
			user.setUserName("用户"+i);
			user.setEmail(i+"@163.com");
			user.setCompanyName("传智播客");
			user.setDeptName("部门"+i);
			list.add(user);
		}

		for (int i = 0; i <4 ; i++) {
			User user = new User();
			user.setUserName("用户"+i);
			user.setEmail(i+"@163.com");
			user.setCompanyName("江南皮革厂");
			user.setDeptName("部门"+i);
			list.add(user);
		}

		JRDataSource datasource = new JRBeanCollectionDataSource(list);
		JasperPrint jasperPrint = JasperFillManager.fillReport(path, new HashMap<>(), datasource);//路径，map集合数据，jrdatasource;
		//3.已数据流预览下载pdf文件
		JasperExportManager.exportReportToPdfStream(jasperPrint,response.getOutputStream());
	}

	/**
	 * 测试list类型的数据填充
	 */
	@RequestMapping("/exportPdf04")
	public void exportPdf04() throws  Exception {
		//1.获取模板路径
		String path = session.getServletContext().getRealPath("/")+"/jasper/test04.jasper";
		//2.数据填充，创建JasperPrint对象
		//查询数据库，获取用户列表
		List<User> list = new ArrayList<>();
		for (int i = 0; i <5 ; i++) {
			User user = new User();
			user.setUserName("用户"+i);
			user.setEmail(i+"@163.com");
			user.setCompanyName("企业"+i);
			user.setDeptName("部门"+i);
			list.add(user);
		}

		//JrDataSource ： jasper中的数据源对象
		//JREmptyDataSource ：没有数据列表
		//JRBeanCollectionDataSource : 数据集合的datasource
		JRDataSource datasource = new JRBeanCollectionDataSource(list);

		JasperPrint jasperPrint = JasperFillManager.fillReport(path, new HashMap<>(), datasource);//路径，map集合数据，jrdatasource;
		//3.已数据流预览下载pdf文件
		JasperExportManager.exportReportToPdfStream(jasperPrint,response.getOutputStream());
	}

	/**
	 * 测试Map类型的数据填充
	 */
	@RequestMapping("/exportPdf03")
	public void exportPdf03()  throws  Exception {
		//1.获取模板路径
		String path = session.getServletContext().getRealPath("/")+"/jasper/test03.jasper";
		//2.数据填充，创建JasperPrint对象
		Map map = new HashMap();
		map.put("username","王者荣耀");
		map.put("age",12);
		map.put("address","北京顺义");
		map.put("company","传智播客");
		JasperPrint jasperPrint = JasperFillManager.fillReport(path, map, new JREmptyDataSource());//路径，map集合数据，jrdatasource;
		//3.已数据流预览下载pdf文件
		JasperExportManager.exportReportToPdfStream(jasperPrint,response.getOutputStream());
	}


	/**
	 * pdf文件下载
	 *  1.入门案例：点击链接，进入到pdf的预览页面
	 */
	@RequestMapping("/exportPdf01")
	public void exportPdf01() throws  Exception {
		//1.获取模板路径
		String path = session.getServletContext().getRealPath("/")+"/jasper/test02.jasper";
		//2.加载模板，创建JasperPrint对象
		/**
		 * 数据填充
		 *  1.模板路径
		 *  2.map类型的参数
		 *  3.list类型的参数（JrDataSource）
		 */
		JasperPrint jp = JasperFillManager.fillReport(path, new HashMap<>(), new JREmptyDataSource());
		//3.输出pdf文件（预览，下载）
		JasperExportManager.exportReportToPdfStream(jp,response.getOutputStream()); //jp对象，outputstream对象
	}
}
